package main

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"time"
)

//视频教程地址：
//https://www.bilibili.com/video/BV1t54y1v78Q?p=11&spm_id_from=pageDriver

func main() {
	count := 0

	//开一个协程，里面是个无限循环，隔一秒就输出一次
	go func() {
		for {
			count++
			fmt.Println("执行：", count)
			time.Sleep(time.Second)
		}
	}()

	//创建一个信道，它的类型是“系统信号”
	c := make(chan os.Signal)

	//不知道为什么和教程中的演示结果不一样，在执行了一两次之后，大概率会提示：urgent I/O condition 然后就结束了，
	//可能是go版本的问题，所以只好把这里的结束时间设置为2秒
	go func() {
		ctx, _ := context.WithTimeout(context.Background(), time.Second*2)
		select {
		case <-ctx.Done():
			c <- os.Interrupt
		}
	}()

	//对信号的监听
	signal.Notify(c)
	//读取信道中的值，会产生阻塞
	s := <-c
	fmt.Println()
	fmt.Println(s) //interrupt = SIGINT = 2
}
